home *** CD-ROM | disk | FTP | other *** search
/ MacHack 2000 / MacHack 2000.toast / pc / The Hacks / 3D QuickTime Dynamics / kSan Sources / kSanAGWindow.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-06-24  |  19.8 KB  |  604 lines

  1. #include "kSanAGWindow.h"
  2. #include "kSanSharedUtils.h"
  3. #include "OHApplicationPublic.h"
  4. #include "OHCursor.h"
  5. #include "OHMenu.h"
  6. #include "OHPictButton.h"
  7. #include "OHMultipleViews.h"
  8. #include "OHScrollableView.h"
  9.  
  10. void    toggleShowBonds (OHWindow * wp);
  11. short AGWinClose (AGWindow *ag);
  12. void AGWinDoNull(OHWindow *wp);
  13.  
  14. void AGWinDoKeyDown(OHWindow *wp, char theChar);
  15. short AGWindowDoMessage (KozoDispatchStack *ds, doMessageMethodArgs *dmma);
  16. short AGWindowHandleReport (KozoDispatchStack *ds, reportMethodArgs *rd);
  17. void AGWindowIdle(AGWindow *gw, EventRecord *event);
  18. short AGWinAddControlsCompletionProc(KozoDispatchStack *ds, constructorMethodArgs *cma, AGWindow *ag);
  19.  short addAGButton(AGWindow *gw, short resID, short nowVisible, ProcPtr func, Rect *theRect, kozoObject **butt);
  20. void setOptionKeyToggleButtons(AGWindow *gw);
  21.  
  22. void    AGWinHandleMenuChoice    (AGWindow * gw, short item);
  23. short AGWindowActivate(AGWindow *gw);
  24. short AGWindowDeactivate(AGWindow *gw);
  25. void initVectorsAndVertices(void);
  26. void initCellManip(AGWindow *gw);
  27. void    AGWindowDoMouseModeSwitch    (AGWindow*ag);
  28. short AGWindowDoMouseMoved ( AGWindow *ag);
  29. //void AGWindowSetWindowCenter(kozoObject *agObj,AGWindow *ag);
  30. void AGWindowDoShowBondsSwitch    (AGWindow *ag);
  31.  
  32.  
  33. //kozoObject *agMenu;
  34.    LinePair gCubeEdges[NUMCUBEEDGES];
  35.    kSanVector gCubeVerticies[NUMCUBEVERTICES];
  36.  
  37. short initClassAGWindow(void)
  38. {
  39.     short err = noErr;
  40.     kozoClass *newClass;
  41.     kozoObject *co;
  42.  
  43.     newClass = addClass(&co,ClassAGWindow,  ClassView, sizeof (AGWindow), "atom graphics window");
  44.     if (newClass)
  45.     {
  46.         err =    setFuncs(newClass, 0L,  AGWindowConstructor,
  47.               AGWindowDestructor, AGWindowGetData, AGWindowSetData, AGWindowDoMessage,
  48.               AGWindowHandleReport, nilCountFunc, nilResolveFunc, nilCreateElementFunc);
  49.         OHViewSetViewFuncs (newClass, AGWindowDraw, AGWindowDoKey, AGWindowDoClick, AGWindowFindObject, nilPointer);
  50.         addInheritance(newClass, ClassScrollableView);
  51.         addInheritance(newClass, ClassFilmableView);
  52.         addInheritance(newClass, ClassPane);
  53.         addInheritance(newClass, ClassMultipleViews);
  54.         addInheritance(newClass, ClassWindow);
  55.         initVectorsAndVertices();
  56.         
  57.          err =  kozoClassAddRemove4ItemsToSave(newClass, true, pMagnification ,pPerspective ,pParticleSize ,pBondsVisible);   
  58.          err =  kozoClassAddRemove4ItemsToSave(newClass, true, pShadeMethod, pSizeMethod , pShadeRange ,pShadeEven );   
  59.          err =  kozoClassAddRemove3ItemsToSave(newClass, true, pParticleSizeFactor , pViewMatrix,  pAGParticleList );   
  60.      }   // note:  pColourMethodObj means get an kozoObject ptr:   kozo should be smart enought to make sure the object is actually saved
  61.     return (err); 
  62. }
  63.  
  64. void initAGMenu(kozoObject *mBarObj)
  65. {
  66.     short err = noErr;
  67.       char  initName[10] = "Graphics";
  68.      kozoObject *agMenu = nilPointer;
  69.      kozoObject *newItem = nilPointer;
  70.   
  71.     kozoNew2DataPtrs(&agMenu, ClassMenu, mBarObj, 
  72.                             pName, typeChar, initName, strlen(initName),
  73.                             pEnabled, typeFalse, nilPointer, 0L);
  74.     
  75.        OHStoreUniqueReference(agMenu, globalAppObject, mAGWindowMenu);
  76.  
  77.     newItem =  kSanMenuItemAllocateWithThreeArgs(agMenu, (ProcPtr) messageForFrontWindow, kDoDialogMessage, typeNull, nilPointer, "Settings...");
  78.     newItem =  kSanMenuItemAllocateWithThreeArgs(agMenu, (ProcPtr) messageForFrontWindow, kAGWindowMouseFunctionToggle, typeNull,nilPointer, "Mouse Manipulation");
  79.      OHStoreUniqueReference(newItem, globalAppObject, iMouseModeMenuItem);
  80.     newItem =  kSanMenuItemAllocateWithThreeArgs(agMenu, (ProcPtr) messageForFrontWindow, kAGWindowShowBondsToggle, typeNull,nilPointer, "Bond Visibility");
  81.      OHStoreUniqueReference(newItem, globalAppObject, iBondsMenuItem);
  82.     newItem =  kSanMenuItemAllocateWithThreeArgs(agMenu, (ProcPtr) messageForFrontWindow, kAGWindowDefaultView,typeNull, nilPointer, "Default View");
  83.  
  84. }
  85.  
  86. void setCubeEdge(LinePair*edge, short start, short end, short colour);
  87. void setCubeEdge(LinePair*edge, short start, short end, short colour)
  88. {
  89.     edge->start = start;
  90.     edge->end = end;
  91.     edge->colour = colour;
  92. }
  93.  
  94. void initVectorsAndVertices(void)
  95. {
  96.  
  97. #ifndef __2DVectors__
  98.     setkSanVectorD (&gCubeVerticies[0],  0.5,  0.5,  0.5 );
  99.     setkSanVectorD (&gCubeVerticies[1],  0.5,  0.5, -0.5 );
  100.     setkSanVectorD (&gCubeVerticies[2],  0.5, -0.5,  0.5 );
  101.     setkSanVectorD (&gCubeVerticies[3],  0.5, -0.5, -0.5 );
  102.     setkSanVectorD (&gCubeVerticies[4], -0.5,  0.5,  0.5 );
  103.     setkSanVectorD (&gCubeVerticies[5], -0.5,  0.5, -0.5 );
  104.     setkSanVectorD (&gCubeVerticies[6], -0.5, -0.5,  0.5 );
  105.     setkSanVectorD (&gCubeVerticies[7], -0.5, -0.5, -0.5 );
  106. #else
  107.     setkSanVectorD (&gCubeVerticies[0],  0.5,  0.5, 0 );
  108.     setkSanVectorD (&gCubeVerticies[1],  0.5, -0.5, 0 );
  109.     setkSanVectorD (&gCubeVerticies[2], -0.5,  0.5, 0 );
  110.     setkSanVectorD (&gCubeVerticies[3], -0.5, -0.5, 0 );
  111. #endif
  112.  
  113. #ifndef __2DVectors__
  114.     setCubeEdge(&gCubeEdges[0], 0,1,kLinePairBlackColour);
  115.     setCubeEdge(&gCubeEdges[1], 0,2,kLinePairBlackColour);
  116.     setCubeEdge(&gCubeEdges[2], 0,4,kLinePairBlackColour);
  117.     setCubeEdge(&gCubeEdges[3], 1,3,kLinePairBlackColour);
  118.     setCubeEdge(&gCubeEdges[4], 1,5,kLinePairBlackColour);
  119.     setCubeEdge(&gCubeEdges[5], 2,3,kLinePairBlackColour);
  120.     setCubeEdge(&gCubeEdges[6], 2,6,kLinePairBlackColour);
  121.     setCubeEdge(&gCubeEdges[7], 3,7,kLinePairRedColour);
  122.     setCubeEdge(&gCubeEdges[8], 4,5,kLinePairBlackColour);
  123.     setCubeEdge(&gCubeEdges[9], 4,6,kLinePairBlackColour);
  124.     setCubeEdge(&gCubeEdges[10], 5,7,kLinePairGreenColour);
  125.     setCubeEdge(&gCubeEdges[11], 6,7,kLinePairBlueColour);
  126. #else
  127.     setCubeEdge(&gCubeEdges[0], 0,1,kLinePairBlackColour);
  128.     setCubeEdge(&gCubeEdges[1], 0,2,kLinePairBlackColour);
  129.      setCubeEdge(&gCubeEdges[2], 1,3,kLinePairRedColour);
  130.      setCubeEdge(&gCubeEdges[3], 2,3,kLinePairGreenColour);    
  131. #endif
  132. }
  133.  
  134. void initCellManip(AGWindow *gw)
  135. {
  136.     gw->manip.latRotateAngle = 2.0;
  137.     gw->manip.longRotateAngle = 2.0;
  138.     gw->manip.axialRotateAngle = 2.0;
  139.     gw->manip.horizShift = 0.5;
  140.     gw->manip.vertShift = 0.5;
  141.     gw->manip.hikiShift = 0.5;
  142. }
  143.  
  144. short AGWindowConstructor(KozoDispatchStack *ds, constructorMethodArgs *cma)
  145. {
  146.     short err = noErr;
  147.     char beingUnflattened = false;
  148.     float halfFloat = 0.5;
  149.     DescType classToDraw = ClassButton;
  150.     Rect r = {-1000, -1000, +1000, +1000};
  151.     AGWindow *gw = (AGWindow *) ds->thisPD;
  152.     
  153.      insertParam (cma->initialData, pBounds, typeQDRectangle, &r, sizeof(Rect));
  154.     extractParam (ds, cma->initialData, pVisibleBounds, typeQDRectangle, &r, sizeof(Rect));
  155.     insertParam (cma->initialData, pMVClassToDraw, typeType, &classToDraw, sizeof(DescType));
  156.     insertParam (cma->initialData, pHorizontalFractionScrolled, typeShortFloat, &halfFloat, sizeof(float));
  157.     insertParam (cma->initialData, pVerticalFractionScrolled, typeShortFloat, &halfFloat, sizeof(float));
  158.  
  159.     if (! AERecordHasKey(cma->initialData, pAGParticleList) ) insertParam (cma->initialData, pIncludeAllParticles, typeTrue, nilPointer, 0L);
  160.     
  161.     extractParam (ds, cma->initialData, pBeingUnflattened, typeBoolean, &beingUnflattened, sizeof(char)) ;
  162.     err = dispatchLoop(ds, cma);
  163.     if (!err)
  164.     {
  165.         gw->win = KDSGetPrivateData(ds, ClassWindow);
  166.         gw->mode = kSelectAndHighlightMode;
  167.         gw->doColourCalc = true;
  168.         initCellManip(gw);
  169.         AGDefaultView(&gw->windowView);
  170.  
  171.         AGSetSizeMethod (gw, kSizeByWindow);
  172.         AGSetShadeMethod (gw, kNoShade);
  173.         
  174.         gw->cpi = nilPointer;
  175.         gw->sim = simData (cma->container);
  176.         if (!beingUnflattened) AGSetColourMethodMenuChoice(gw, 1);
  177.         err = VSListInitialize(&gw->grafDataList, sizeof(grafData));
  178.         //gw->grafDataHandle = NewHandle(0);  // a grafData structure
  179.         //gw->grafLockCount = 0;
  180.     }
  181.      initializeList(&gw->orderList);    
  182.      initializeList(&gw->particleList);
  183.      BitListInitialize(&gw->partBits);
  184.     KDSAddCompletionProc(ds, AGWinAddControlsCompletionProc, gw);
  185.      KDSReturnError(ds, err);
  186. }
  187.  
  188.  
  189.  
  190. short AGWindowDestructor (KozoDispatchStack *ds, destructorMethodArgs* dma)
  191. {
  192. #pragma unused(dma)
  193.     AGWindow *gw = (AGWindow *) ds->thisPD;
  194.      AGWinInstallModule (gw, ClassColourPlugIn, nilPointer);
  195.  
  196.     BitListDispose(&gw->partBits);
  197.     VSListDispose(&gw->grafDataList);
  198.     disposeList(&gw->orderList );
  199.     disposeList(&gw->particleList);
  200.     KDSReturnContinue(ds);
  201. }
  202.  
  203.  
  204.  
  205. short AGWindowDoMouseMoved ( AGWindow *ag)
  206. {
  207.     short err = noErr;
  208.      char unused;
  209.     char useArrow = false;
  210.    #pragma unused(unused)
  211.     RgnHandle rgn = NewRgn();
  212.     RgnHandle circleRgn = NewRgn();
  213.     OHBufferedView *bv = kozoObjectGetPrivateData (ag->win->obj, ClassBufferedView);
  214.     kozoObject *newCursorObj = nilPointer;
  215.     Point zeroPoint = {0,0};
  216.     Point localPoint;
  217.     
  218.     GetMouse (&localPoint);
  219.     LocalToGlobal (&zeroPoint);
  220.  
  221.     if (ag->mode == kSelectAndHighlightMode)
  222.     {
  223.         if (PtInRect(localPoint, &( bv->world->portRect))) 
  224.          {
  225.              newCursorObj = OHGetNamedReference(globalAppObject, kFingerCursor);
  226.              RectRgn(rgn, &bv->world->portRect );
  227.              // now subtract the circle region
  228.              DiffRgn(rgn, circleRgn, rgn);
  229.          }
  230.          else
  231.          {
  232.               useArrow = true;
  233.          }
  234.     }
  235.     else
  236.     {
  237.          AGWindowSetDragActiveRegion( ag,  circleRgn);
  238.          if (PtInRgn ( localPoint, circleRgn)) 
  239.          {
  240.              newCursorObj = OHGetNamedReference(globalAppObject, kRotateCursor);
  241.             CopyRgn(circleRgn,  rgn);
  242.          }
  243.          else if (PtInRect(localPoint, &( bv->world->portRect))) 
  244.          {
  245.              newCursorObj = OHGetNamedReference(globalAppObject, kSpinCursor);
  246.              RectRgn(rgn, &bv->world->portRect );
  247.              // now subtract the circle region
  248.              DiffRgn(rgn, circleRgn, rgn);
  249.          }
  250.          else
  251.          {
  252.               useArrow = true;
  253.          }
  254.     }
  255.     
  256.     
  257.     if (useArrow)
  258.     {
  259.         Rect r;
  260.         OHSetRect (&r, localPoint.h, localPoint.v,localPoint.h + 1, localPoint.v + 1); 
  261.         RectRgn(rgn, &r);
  262.         newCursorObj = OHGetNamedReference(globalAppObject, kArrowCursor);
  263.     }
  264.     dispatchNilMessage (newCursorObj , kSetCursorMessage);
  265.     
  266.     if (rgn) OffsetRgn(rgn,zeroPoint.h,zeroPoint.v);
  267.     setAppMouseRegion (rgn);
  268.     DisposeRgn(rgn);
  269.     DisposeRgn(circleRgn);
  270.     return(err);
  271. }
  272.  
  273.  
  274.  
  275. short AGWinDoRotateEvent(AGWindow *ag,  AEMessageData *md);
  276. short AGWinDoRotateEvent(AGWindow *ag,  AEMessageData *md)
  277. {
  278.     short err = noErr;
  279.     AEDesc     data = gNilDesc;
  280.     AEDesc trixDesc = gNilDesc;
  281.     DescType actualType;
  282.     long actualSize;
  283.      float horiz = 0;
  284.     float vert = 0;
  285.     float axial = 0;
  286.     kSanMatrix trix;    
  287.     
  288.      AEGetParamPtr( md->event, keyHorizontalRotation, typeShortFloat, &actualType, &horiz, sizeof(float), &actualSize );
  289.      AEGetParamPtr( md->event, keyVerticalRotation,   typeShortFloat, &actualType, &vert,  sizeof(float), &actualSize );
  290.      AEGetParamPtr( md->event, keyAxialRotation,      typeShortFloat, &actualType, &axial, sizeof(float), &actualSize );
  291.     horiz *= -1.0;
  292.     trix = ag->windowView.viewMatrix;
  293.     Spin3dMatrixInDegreesD(&trix, horiz, vert, axial);
  294.     
  295.     make3dMatrixDescD(&trix, &trixDesc   );
  296.     kozoSetData(ag->win->obj, pViewMatrix,  &trixDesc);
  297.     AEDisposeDesc(&trixDesc);
  298.     
  299.      return (err); 
  300. short AGWindowDoMessage (KozoDispatchStack *ds, doMessageMethodArgs *dmma)
  301. {
  302.     short err = noErr;
  303.     AGWindow *ag = (AGWindow *) ds->thisPD;
  304.     switch (dmma->message)
  305.     {
  306.         case kRotateMessage:
  307.              err = AGWinDoRotateEvent(ag, (AEMessageData *) dmma->data);
  308.             break;
  309.         case kAGWindowSettingsDialog :
  310.         case kDoDialogMessage:
  311.             AGWinDoDialog(ag);
  312.             break; 
  313.          case kAGWindowShowBondsToggle  :
  314.             AGWindowDoShowBondsSwitch(ag);
  315.             break; 
  316.          case kAGWindowDefaultView :
  317.             // dialogResult = doAShortDialog(kSetViewDialogResID, nilPointer);
  318.             break; 
  319.           case kAGWindowMouseFunctionToggle  :
  320.              AGWindowDoMouseModeSwitch(ag);
  321.             break; 
  322.           case kMouseMovedMessage  :
  323.               AGWindowDoMouseMoved(  ag);
  324.             goto Default;
  325.         case kActivateMessage:
  326.                 // set the mouseRegion to a small rect so we'll get a mouse moved event 
  327.             {
  328.                  RgnHandle noRgn = NewRgn();
  329.                 setAppMouseRegion (noRgn);
  330.                 DisposeRgn(noRgn);
  331.             }
  332.             goto Default;
  333.         case kDeactivateMessage:
  334.             {
  335.                 AEDesc activeDesc = {typeTrue, nilPointer};
  336.  
  337.                 if (dmma->message == kDeactivateMessage)  activeDesc.descriptorType = typeFalse;
  338.  
  339.                  err = kozoSetData(OHGetNamedReference(globalAppObject, mAGWindowMenu), pEnabled, &activeDesc);  
  340.              }
  341.             goto Default; 
  342.          case kControlValueChangedMessage:
  343.             break; 
  344.         case  kNullEventMessage:   // not an idle message
  345.             AGWindowIdle( ag, (EventRecord *) dmma->data);
  346.             break;
  347.         case kSetMouseModeButtonsMessage:
  348.             SetAllMouseModeButtons(ag);
  349.             break;
  350.     //    case kGetSimulationPtrMessage:
  351.     //        if (gw->sim) (* ((kSanSimulation **)dmma->data)) = gw->sim;
  352.     //        else   err = OHErrNullObject;
  353.     //        break;
  354.         case  kInitializeWindowOrderListMessage :
  355.              break;
  356.         case kChangeParticleIndexMessage:
  357.              AGWindowChangeParticleIndex( ag,  ((long  *)dmma->data)[0], ((long  *)dmma->data)[1]);
  358.              break;
  359.         case kRemoveParticleListMessage:
  360.             AGWindowRemoveParticleList( ag, (OHList *) dmma->data);
  361.              break;
  362.         case kRemoveParticleMessage:
  363.             AGWindowRemoveParticle( ag, (long) dmma->data);
  364.             break;
  365.          case kAddParticleListMessage :
  366.              err =  AGWindowAddParticleList ( ag,  (OHList *)dmma->data);
  367.             break;
  368.         case kAddParticleMessage :    
  369.             err =  AGWindowAddToPartList( ag, (long) dmma->data);
  370.             break;
  371.         case kUnflattenFinishedMessage:
  372.             err = dispatchLoop(ds, dmma);
  373.             {
  374.                 kozoObject *aPlugIn = OHGetNamedReference(ds->obj, ClassColourPlugIn);
  375.                 
  376.                    if (!aPlugIn)  aPlugIn = kozoObjectGetNthItemOfClassX(ds->obj, ClassColourPlugIn, 0);
  377.                    
  378.                  if (aPlugIn) 
  379.                 {
  380.                     err = AGWinInstallModule (ag, ClassColourPlugIn, aPlugIn);
  381.                 }
  382.                 else
  383.                 { 
  384.                     AGSetColourMethodMenuChoice(ag, 1);
  385.                   }
  386.               }
  387.             goto Default;
  388.         case kCopyMessage:
  389.              err = dispatchLoop(ds, dmma);
  390.         case kCutMessage:
  391.         case kPasteMessage:
  392.         case kClearMessage: // send the message to the simulation
  393.             if (!err) err = forwardMessage (simOBJ(ag->sim),  dmma);
  394.             break;
  395.         Default:
  396.         default:
  397.             KDSReturnContinue(ds);
  398.             break;
  399.     }
  400.     KDSDoneDispatch(ds);
  401.     KDSReturnError(ds, err);
  402. }
  403.  
  404. short AGWindowHandleReport (KozoDispatchStack *ds, reportMethodArgs *rd)
  405. {
  406.     short err = noErr;
  407.     short shouldContinue = true;
  408.     AGWindow *gw = (AGWindow *) ds->thisPD;
  409.     
  410.      switch (rd->functionForContainer)
  411.     {
  412.         case fDoMessage:
  413.             switch (rd->args.dmma.message)
  414.             {
  415. //                 case  kGetSimulationPtrReport:   
  416. //                    AGWindowDoMessage(ds, &rd->args.dmma);
  417. //                    shouldContinue = false;
  418. //                    break;
  419.             }
  420.             break;
  421.     }
  422.     if (!shouldContinue) KDSDoneDispatch(ds);
  423.     KDSReturnError(ds, err);
  424. }
  425. void AGWindowIdle( AGWindow *gw, EventRecord *event)
  426. {    
  427.  #pragma unused(event)
  428.  
  429.      setOptionKeyToggleButtons( gw);
  430.     // AGWindowMaintainCursor(ag);
  431. }
  432.  
  433. short AGWinAddControlsCompletionProc(KozoDispatchStack *ds, constructorMethodArgs *cma, AGWindow *ag)
  434. {    
  435. #pragma unused(cma)
  436.     short err = noErr;
  437.     short scrollInset = 68;
  438.     kozoObject *butt;
  439.     Rect r;
  440.  
  441.     if (!err) err = kozoGetDataPtr ( ds->obj, pBounds, typeQDRectangle, &r, sizeof(Rect));
  442.     r.bottom = OHRectHeight(&r) + 1;
  443.     r.top = r.bottom - 16;
  444.     r.left = 0;
  445.     r.right = r.left + 17;
  446.  
  447.     if (!err) err = kozoSetDataPtr ( ds->obj, pScrollLeftInset, typeShortInteger, &scrollInset, sizeof(short));
  448.     addAGButton( ag,  kMagnifyPictResID, true,  (ProcPtr) magnifyButtonProc,  &r, &butt);
  449.     addAGButton( ag,  kUnmagnifyPictResID,false ,  (ProcPtr) unmagnifyButtonProc,  &r, &butt);
  450.  
  451.     r.left = r.right;
  452.     r.right = r.left + 17;
  453.     addAGButton(ag,  kCloserPictResID, true, (ProcPtr) closerButtonProc,  &r, &butt );
  454.     addAGButton( ag,  kFurtherPictResID, false , (ProcPtr) furtherButtonProc,  &r, &butt);
  455.  
  456.     r.left = r.right;
  457.     r.right = r.left + 17;
  458.     addAGButton( ag,  kLargeBallPictResID, true , (ProcPtr) largerButtonProc,  &r, &butt);
  459.     addAGButton( ag,  kSmallBallPictResID, false , (ProcPtr) smallerButtonProc,  &r, &butt);
  460.  
  461.     r.left = r.right;
  462.     r.right = r.left + 17;
  463.     addAGButton( ag,  kRollCellPictResID, true , (ProcPtr) rollCellButtonProc,  &r, &butt);
  464.     OHStoreUniqueReference(butt, ds->obj, kAGRollCellButton);
  465.  
  466.     addAGButton( ag,  kSelectFingerPictResID, false , (ProcPtr)selectFingerButtonProc,  &r, &butt);
  467.     OHStoreUniqueReference(butt, ds->obj, kAGSelectHighlightButton);
  468.     return (err);
  469. }
  470.  
  471. void setOptionKeyToggleButtons( AGWindow *gw)
  472. {
  473.     short i = 0;
  474.     char optionKeyPressed = 0;
  475.     char unused;
  476. #pragma unused(unused)
  477.     OHList *buttList;
  478.     kozoObject* nthButt;
  479.     
  480.     
  481.     optionKeyPressed = keyIsPressed(kOptionKeyCode);
  482.     if (gw->lastToggle != optionKeyPressed)
  483.     {
  484.         buttList = getListOfObjectsOfClassX (gw->win->obj, ClassButton);
  485.         if (buttList)
  486.         {
  487.             gw->lastToggle = optionKeyPressed;
  488.             for ( i= 0; i < 3; ++i)
  489.             {
  490.                 char val ;
  491.                 nthButt = castTokozoObject(getNthItem (buttList, (2 * i)));  // e.g. magnify button
  492.                 val = (!optionKeyPressed);
  493.                 if (nthButt) packageAndCallSetBool(nthButt, pVisible, val);    
  494.                 nthButt = castTokozoObject(getNthItem (buttList, (1 + (2 * i))));  // e.g. magnify button
  495.                 val = (optionKeyPressed);
  496.                 if (nthButt) packageAndCallSetBool(nthButt, pVisible, val);    
  497.             }
  498.              releaseListOfObjectsOfClassX (gw->win->obj,  ClassButton);
  499.         }
  500.     }
  501. }
  502. void SetAllMouseModeButtons( AGWindow *ag)
  503. {
  504.      kozoObject * butt;
  505.     char val;
  506.     
  507.     val = (ag->mode == kSelectAndHighlightMode);
  508.     butt =  OHGetNamedReference(ag->win->obj, kAGRollCellButton);
  509.     if (butt)  packageAndCallSetBool(butt, pVisible, val);
  510.  
  511.     val = (ag->mode != kSelectAndHighlightMode);
  512.     butt =  OHGetNamedReference(ag->win->obj, kAGSelectHighlightButton);
  513.     if (butt)  packageAndCallSetBool(butt, pVisible, val);
  514.  
  515.     setMenuToSTR( iMouseModeMenuItem, (ag->mode == kMouseManipulationMode ? kSelectAndHighlightStringID : kMouseManipulationStringID) , "\pmouse mode");
  516. }
  517.  
  518.  short addAGButton( AGWindow *gw, short resID, short nowVisible, ProcPtr func, Rect *theRect, kozoObject **butt)
  519. {
  520.     short err = noErr;
  521.     short canSlide =  topMovesWithWindowSize + bottomMovesWithWindowSize;
  522.     short roundSize = 2;
  523.     short bevelVariant = kControlBevelButtonSmallBevelProc;
  524.      char viz  = nowVisible;
  525.     char unused;
  526. #pragma unused(unused)
  527.     long oneArg  = 1L;
  528.      AEDesc pictDesc = {'PICT', nilPointer};
  529.     AEDesc initialData = {typeNull, nilPointer};
  530.      
  531.       *butt = nilPointer;
  532.     err = stuffRecord5Ptrs( &initialData,  pBounds, typeQDRectangle, (Ptr) theRect,  sizeof(Rect),
  533.                                            pVisible, typeBoolean,  (Ptr) &viz,  sizeof(char), 
  534.                                            pPersistent, typeFalse,  nilPointer,  0L, 
  535.                                             pBevelButtonVariant, typeShortInteger, &bevelVariant, sizeof(short),
  536.                                           pPICTRezID, typeShortInteger, (Ptr) &resID, sizeof(short));
  537.                                            
  538.      err = stuffRecord4Ptrs( &initialData,  pProcPtr,  typeProcPtr, (Ptr) &func,  sizeof(long)  ,
  539.                                            pNumArgs,  typeLongInteger, (Ptr) &oneArg,  sizeof(long)  ,
  540.                                            pArgument1,  typeLongInteger, (Ptr) &gw,  sizeof(long)  ,
  541.                                            pSlidability,  typeShortInteger, (Ptr) &canSlide,  sizeof(short) );
  542.     
  543.      if (!err) err = kozoNew(butt, ClassPictButton, gw->win->obj, &initialData);
  544.      AEDisposeDesc (&initialData);
  545.      return (err);
  546. }
  547.  
  548. void    AGWindowDoMouseModeSwitch    ( AGWindow*ag)
  549. {
  550.     if (ag->mode == kSelectAndHighlightMode)
  551.     {
  552.         AGSetMouseMode ( ag, kMouseManipulationMode );
  553.     }
  554.     else if (ag->mode == kMouseManipulationMode)
  555.     {
  556.         AGSetMouseMode (  ag, kSelectAndHighlightMode );
  557.     }
  558. }
  559.  
  560.  /*
  561.  
  562. void AGWindowSetWindowCenter(kozoObject *agObj, AGWindow *ag)
  563. {
  564. //    short nowVal, maxVal, wHeight, wWidth;
  565.       Point newCenter = {100, 100};
  566.     wHeight = worldRect.bottom - worldRect.top;
  567.     wWidth = worldRect.right -worldRect.left;
  568.     
  569.     if (gwp->pane.vScroll)
  570.     {
  571.         nowVal = GetControlValue(gwp->pane.vScroll->control.cHandle);
  572.         maxVal = GetControlMaximum(gwp->pane.vScroll->control.cHandle);
  573.         newCenter.v =  (( (maxVal *0.5)- nowVal )  * kMaxWindowHeight / maxVal)   ;
  574.     }
  575.     if (gwp->pane.hScroll)
  576.     {
  577.         nowVal = GetControlValue(gwp->pane.hScroll->control.cHandle);
  578.         maxVal = GetControlMaximum(gwp->pane.hScroll->control.cHandle);
  579.         newCenter.h =    (( (maxVal *0.5) - nowVal) * kMaxWindowWidth / maxVal) ;
  580.     }
  581.     ag->windowView.cellCenter = newCenter;
  582. }
  583.     */
  584. /************  DoShowBondsSwitch   ****************/
  585. void AGWindowDoShowBondsSwitch    ( AGWindow *ag)
  586. {
  587.     AGSetBondsVisible ( ag, ((short)(!(ag->windowView.showBonds))));
  588.     dispatchNilMessage(ag->win->obj, kInvalSelfMessage);
  589. }
  590.  
  591.  
  592. grafData *  AGWindowLockGrafDataC(AGWindow * ag, long *numItems) 
  593. {
  594.     if (ag->grafDataDirty) AGWindowReinitializeGrafDataList(ag);
  595.      return((grafData *)(VSListLockC(&ag->grafDataList, numItems)));
  596. }
  597. grafData *  AGWindowLockGrafData(AGWindow * ag) 
  598. {
  599.     if (ag->grafDataDirty) AGWindowReinitializeGrafDataList(ag);
  600.     return((grafData *)(VSListLock(&ag->grafDataList)));
  601. }
  602.  
  603.